package com.hunliji.monitor.share.component.lock;

import com.hunliji.monitor.share.component.lock.enums.DistributedLockConstants;

/**
 * 分布式锁实现
 * @author wuchen
 */

public interface DistributedLockFacade {
    /**
     * 分布式锁的上锁
     * 使用可重入的模式进行上锁
     * todo 直接用Java的TimeUnit
     * @param key：key
     * @param timeout：获取锁的超时时间
     * @param expires：持有锁的有效时间
     * @param timeType : 时间单位类型{@link DistributedLockConstants.TimeType}
     * @return 获取锁是否成功
     */
    Boolean lock(String key, Long timeout, Long expires, DistributedLockConstants.TimeType timeType);

    /**
     * 分布式锁的上锁
     * 使用可重入的模式进行上锁
     * 默认使用毫秒作为时间计数单位
     * @param key：key
     * @param timeout：获取锁的超时时间
     * @param expires：持有锁的有效时间
     * @return 获取锁是否成功
     */
    Boolean lock(String key, Long timeout, Long expires);

    /**
     * 分布式锁的上锁
     * 使用可重入的模式进行上锁
     * 默认使用毫秒作为时间计数单位
     * 默认使用超时时间 = 50ms
     * 默认使用过期释放时间 = 1000ms
     * @param key：key
     * @return 获取锁是否成功
     */
    Boolean lock(String key);

    /**
     * 解锁
     * @param key：key
     */
    void unLock(String key);
}
